package br.uniriotec.pm.business.rules.impl;



import static org.junit.Assert.*;

import java.math.BigDecimal;

import org.junit.Before;
import org.junit.Test;

import br.uniriotec.pm.business.rules.exception.RuleException;
import br.uniriotec.pm.domain.Vendedor;
import br.uniriotec.pm.dto.CalculoComissaoVendedor;

public class RuleComissaoVendedorImplTest {

	private RuleComissaoVendedorImpl ruleComissaoVendedorImpl;
	
	@Before
	public void setUp() throws Exception {
		ruleComissaoVendedorImpl = new RuleComissaoVendedorImpl();
	}

	/**
	 * verifica se ao calcular a comissão de um vendedor com categoria inválida é lançada um exceção
	 */
	@Test
	public void calcularComissaoVendedorCategoriaInvalida() {
		
		Vendedor vendedor = new Vendedor();
		vendedor.setCategoria(3);
		
		CalculoComissaoVendedor calculoComissaoVendedor = new CalculoComissaoVendedor();
		calculoComissaoVendedor.setVendedor(vendedor);
		
		try {
			ruleComissaoVendedorImpl.avaliar(calculoComissaoVendedor);
			fail();
		} catch (RuleException r) {
			assertEquals(RuleComissaoVendedorImpl.ERRO_CATEGORIA_VENDEDOR_IDENTIFICADA, r.getMessage());
		}	
	}
	
	/**
	 * verifica se o cálculo da comissão do vendedor de categoria 1 é feito corretamente quando o valor total das vendas
	 * é menor que 1000.
	 * @throws RuleException 
	 */
	@Test
	public void calcularComissaoVendedorCategoria1ValorTotalVendasMenor1000() throws RuleException {
		
		Vendedor vendedor = new Vendedor(Long.valueOf(1), "Diogo", 1);
		CalculoComissaoVendedor calculoComissaoVendedor = new CalculoComissaoVendedor(vendedor, new BigDecimal("900"));
		
		assertEquals(new BigDecimal("90"), ruleComissaoVendedorImpl.avaliar(calculoComissaoVendedor));
	}
	
	/**
	 * verifica se o cálculo da comissão do vendedor de categoria 1 é feito corretamente quando o valor total das vendas
	 * é igual a 1000.
	 * @throws RuleException 
	 */
	@Test
	public void calcularComissaoVendedorCategoria1ValorTotalVendasIgual1000() throws RuleException {
		
		Vendedor vendedor = new Vendedor(Long.valueOf(1), "Diogo", 1);
		CalculoComissaoVendedor calculoComissaoVendedor = new CalculoComissaoVendedor(vendedor, new BigDecimal("1000"));
		
		assertEquals(new BigDecimal("100"), ruleComissaoVendedorImpl.avaliar(calculoComissaoVendedor));
	}
	
	/**
	 * verifica se o cálculo da comissão do vendedor de categoria 1 é feito corretamente quando o valor total das vendas
	 * é entre 1000 e 1800.
	 * @throws RuleException 
	 */
	@Test
	public void calcularComissaoVendedorCategoria1ValorTotalVendasEntre1000e1800() throws RuleException {
		
		Vendedor vendedor = new Vendedor(Long.valueOf(1), "Diogo", 1);
		CalculoComissaoVendedor calculoComissaoVendedor = new CalculoComissaoVendedor(vendedor, new BigDecimal("1500"));
		
		assertEquals(new BigDecimal("175"), ruleComissaoVendedorImpl.avaliar(calculoComissaoVendedor));
	}
	
	/**
	 * verifica se o cálculo da comissão do vendedor de categoria 1 é feito corretamente quando o valor total das vendas
	 * é igual a 1800.
	 * @throws RuleException 
	 */
	@Test
	public void calcularComissaoVendedorCategoria1ValorTotalVendasIgual1800() throws RuleException {
		
		Vendedor vendedor = new Vendedor(Long.valueOf(1), "Diogo", 1);
		CalculoComissaoVendedor calculoComissaoVendedor = new CalculoComissaoVendedor(vendedor, new BigDecimal("1800"));
		
		assertEquals(new BigDecimal("220"), ruleComissaoVendedorImpl.avaliar(calculoComissaoVendedor));
	}
	
	/**
	 * verifica se o cálculo da comissão do vendedor de categoria 1 é feito corretamente quando o valor total das vendas
	 * é maior que 1800.
	 * @throws RuleException 
	 */
	@Test
	public void calcularComissaoVendedorCategoria1ValorTotalVendasMaior1800() throws RuleException {
		
		Vendedor vendedor = new Vendedor(Long.valueOf(1), "Diogo", 1);
		CalculoComissaoVendedor calculoComissaoVendedor = new CalculoComissaoVendedor(vendedor, new BigDecimal("2000"));
		
		assertEquals(new BigDecimal("260"), ruleComissaoVendedorImpl.avaliar(calculoComissaoVendedor));
	}
	
	/**
	 * verifica se o cálculo da comissão do vendedor de categoria 2 é feito corretamente quando o valor total das vendas
	 * é menor que 2000.
	 * @throws RuleException 
	 */
	@Test
	public void calcularComissaoVendedorCategoria2ValorTotalVendasMenor2000() throws RuleException {
		
		Vendedor vendedor = new Vendedor(Long.valueOf(1), "Diogo", 2);
		CalculoComissaoVendedor calculoComissaoVendedor = new CalculoComissaoVendedor(vendedor, new BigDecimal("1600"));
		
		assertEquals(new BigDecimal("160"), ruleComissaoVendedorImpl.avaliar(calculoComissaoVendedor));
	}
	
	/**
	 * verifica se o cálculo da comissão do vendedor de categoria 2 é feito corretamente quando o valor total das vendas
	 * é igual a 2000.
	 * @throws RuleException 
	 */
	@Test
	public void calcularComissaoVendedorCategoria2ValorTotalVendasIgual2000() throws RuleException {
		
		Vendedor vendedor = new Vendedor(Long.valueOf(1), "Diogo", 2);
		CalculoComissaoVendedor calculoComissaoVendedor = new CalculoComissaoVendedor(vendedor, new BigDecimal("2000"));
		
		assertEquals(new BigDecimal("200"), ruleComissaoVendedorImpl.avaliar(calculoComissaoVendedor));
	}
	
	/**
	 * verifica se o cálculo da comissão do vendedor de categoria 2 é feito corretamente quando o valor total das vendas
	 * é entre 2000 e 4000.
	 * @throws RuleException 
	 */
	@Test
	public void calcularComissaoVendedorCategoria2ValorTotalVendasEntre2000e4000() throws RuleException {
		
		Vendedor vendedor = new Vendedor(Long.valueOf(1), "Diogo", 2);
		CalculoComissaoVendedor calculoComissaoVendedor = new CalculoComissaoVendedor(vendedor, new BigDecimal("3000"));
		
		assertEquals(new BigDecimal("600"), ruleComissaoVendedorImpl.avaliar(calculoComissaoVendedor));
	}
	
	/**
	 * verifica se o cálculo da comissão do vendedor de categoria 2 é feito corretamente quando o valor total das vendas
	 * é igual a 4000.
	 * @throws RuleException 
	 */
	@Test
	public void calcularComissaoVendedorCategoria2ValorTotalVendasIgual4000() throws RuleException {
		
		Vendedor vendedor = new Vendedor(Long.valueOf(1), "Diogo", 2);
		CalculoComissaoVendedor calculoComissaoVendedor = new CalculoComissaoVendedor(vendedor, new BigDecimal("4000"));
		
		assertEquals(new BigDecimal("800"), ruleComissaoVendedorImpl.avaliar(calculoComissaoVendedor));
	}
	
	/**
	 * verifica se o cálculo da comissão do vendedor de categoria 2 é feito corretamente quando o valor total das vendas
	 * é maior que 4000.
	 * @throws RuleException 
	 */
	@Test
	public void calcularComissaoVendedorCategoria2ValorTotalVendasMaior4000() throws RuleException {
		
		Vendedor vendedor = new Vendedor(Long.valueOf(1), "Diogo", 2);
		CalculoComissaoVendedor calculoComissaoVendedor = new CalculoComissaoVendedor(vendedor, new BigDecimal("5000"));
		
		assertEquals(new BigDecimal("1500"), ruleComissaoVendedorImpl.avaliar(calculoComissaoVendedor));
	}

}
